import FileUtils from "../lang/commons/file-utils";

/**
 * 通用文件列表
 *
 * 在制作文件列表的时候，对于已经上传的，和将要上传的文件，需要统一转为下列各式，供程序进一步处理
 *
 * 文件上传插件中，包含文件回显的插件，都采用当前数据格式
 */
export interface FileItemType {
    /**
     * 文件对象
     */
    ref: File;
    /**
     * 唯一 ID，如果是已存储的历史数据，需要给出数据 ID
     */
    id: string;
    /**
     * 文件地址，数据库中需要存储的，逻辑上的文件地址
     *
     * url 和 id 一般二选一即可，基础代码上不做限制，根据实际业务选用即可
     */
    url: string;
    /**
     * 可供预览的地址
     */
    src: string;
    /**
     * 文件名
     */
    name: string;
    /**
     * 图标（font-icon），如果文件不可预览，默认的图标
     */
    icon: string;
    /**
     * 文件类型，类似于 mini-type
     */
    type: 'image' | 'pdf' | 'file';
    /**
     * 设计一个标记位，确保不会二次上传
     *
     * 避免因为低质量的代码，导致文件重复上传的风险
     */
    tag: false;
}

/**
 * 通用文件上传接口
 *
 * 包含基本的编辑逻辑，至于数据查询、业务封装，需要根据需求进行特殊定制
 *
 */
export interface UploaderType {
    /**
     * 文件上传接口
     *
     * 默认不上传文件，等提交表单的时候，统一处理所有数据
     *
     * 也可以重新设计当前接口，提交一个文件，上传一个
     *
     * @param file  - 文件对象
     * @return 转换之后的文件对象
     */
    upload: (file: File) => Promise<FileItemType>;

    /**
     * 文件移除接口
     *
     * 文件上传组件中，点击了移除事件
     *
     * @param item  - 文件对象实体
     * @returns void
     */
    remove: (item: FileItemType) => void;

    /**
     * 文件下载
     *
     * 点击了文件之后产生的事件，内部封装调用远程 API 的逻辑；
     * 图片、文本一般直接预览，其它文件则下载；
     *
     * @param item {FileItemType} - 文件对象实体
     * @returns void
     */
    download: (item: FileItemType) => void;
}


/**
 * 默认的文件上传下载设置
 */
class Uploader implements UploaderType {

    upload(file: File) {
        const ext = FileUtils.getExtension(file.name);
        const icon = FileUtils.getFileIcon(ext);
        const type = FileUtils.getFileType(ext);

        const item: FileItemType = {
            ref: file,
            name: file.name,
            type: type,
            icon: icon,
            url: undefined,
            src: undefined,
            tag: false,
            id: undefined
        };

        if (type === 'image') {
            return FileUtils.readAsBase64(file).then(url => {
                item.src = url;
                return Promise.resolve(item);
            })
        } else {
            return Promise.resolve(item);
        }
    }

    remove(item: FileItemType) {
        return Promise.resolve();
    }

    download(item: FileItemType) {
        if (item.type === 'image') {
            // 使用内置的相册
            EventBus.openAlbum(item.src);
        } else {
            if (item.ref !== undefined) {
                // 本次刚刚提交的文件，允许点击之后下载
                FileUtils.downloadBlob(item.name, item.ref);
            } else if (item.id !== undefined) {
                // 修改界面中，此前已经提交的文件
                window.open(item.url);
            }
        }
    }
}

export default Uploader;